import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
#读取视频文件
cap=cv.VideoCapture('bike.mp4')

#循环播放视频
while cap.isOpened():
    #逐帧读取
    ret,frame=cap.read()
    if not ret:
        print("haven't read the frame")
        break
    #转换为灰度图
    gray=cv.cvtColor(frame,cv.COLOR_BGR2GRAY)
    #获取傅里叶系数
    fCoef=np.fft.fft2(gray)

    #放大傅里叶系数获得振幅谱
    amp_list=20*np.log(np.abs(fCoef))

    #将低频移到中间
    fCoef2=np.fft.fftshift(fCoef)
    #获取振幅谱
    amp_list2=20*np.log(np.abs(fCoef2))

    #振幅谱的值域过大，超出了imshow函数的显示范围，使用cv.normalize函数将其归一化到0-255的范围内再进行显示
    amp_list = cv.normalize(amp_list, None, 0, 255, cv.NORM_MINMAX, cv.CV_8U)
    amp_list2 = cv.normalize(amp_list2, None, 0, 255, cv.NORM_MINMAX, cv.CV_8U)
    
    cv.imshow('frame',gray)
    cv.imshow('mg_spc',amp_list)
    cv.imshow('mg_spc_shift',amp_list2)

    #每隔1ms检查一次用户输入，如果按下'q'则退出循环
    if cv.waitKey(1)==ord('q'):
        break
cap.release()
cv.destroyAllWindows()


